package br.com.werp.regras.suporte.controle;

import java.util.Iterator;
import java.util.List;

import br.com.werp.regras.geral.Algoritimo;
import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.suporte.ManutencaoVO;
import br.com.werp.regras.geral.vos.suporte.MaquinasDetalheFormVO;
import br.com.werp.regras.geral.vos.tabelas.Manutencao;
import br.com.werp.regras.suporte.integracao.FabricaDAO;
import br.com.werp.regras.suporte.integracao.ManutencaoDAO;


public class ControleManutencao {
    public void manterManutencaoMaquina(Object form, List manutencoes)
        throws Exception {
        MaquinasDetalheFormVO maquinasDetalheFormVO = new MaquinasDetalheFormVO();

        ManutencaoVO manutencaoVO = new ManutencaoVO();

        BeanUtil.copiarVO(form, maquinasDetalheFormVO);

        Algoritimo algoritimo = FabricaSubSistema.getAlgoritimo();

        if (Constantes.ADICIONAR.equals(maquinasDetalheFormVO.getManutecaoOp())) {
            BeanUtil.copiarVOStringTipo(maquinasDetalheFormVO, manutencaoVO);

            manutencaoVO.setManu_maquina(Util.zeroOuInt(
                    maquinasDetalheFormVO.getMaqn_id()));

            algoritimo.criarIdVirtual(manutencoes, manutencaoVO);
        } else {
            algoritimo.removerIdVirtual(manutencoes,
                maquinasDetalheFormVO.getManutencoes());
        }
    }

    public void atualizarManutencaoMaquina(Object form, List manutencoes,
        String usuario) throws Exception {
        ManutencaoDAO manutencaoDAO = FabricaDAO.getManutecaoDAO();

        Auditoria auditoria = FabricaSubSistema.getAuditoria();

        MaquinasDetalheFormVO maquinasDetalheFormVO = new MaquinasDetalheFormVO();

        BeanUtil.copiarVO(form, maquinasDetalheFormVO);

        Object key = manutencaoDAO.iniciarTransacao();

        try {
            apagarManutencoes(maquinasDetalheFormVO, manutencoes, usuario, key);

            for (Iterator iter = manutencoes.iterator(); iter.hasNext();) {
                ManutencaoVO element = (ManutencaoVO) iter.next();

                if (!element.isIdVirtual()) {
                    continue;
                }

                Manutencao manutencao = new Manutencao();

                BeanUtil.copiarVO(element, manutencao);

                manutencaoDAO.inserirVOGenericoIdentity(key, manutencao,
                    "manu_id");
                auditoria.auditarRecurso(key, usuario, manutencao,
                    Auditoria.INCLUIR);
            }

            manutencaoDAO.concluirTransacao(key);
        } catch (Exception e) {
            manutencaoDAO.abortarTransacao(key);
            throw e;
        }
    }

    private void apagarManutencoes(
        MaquinasDetalheFormVO maquinasDetalheFormVO, List manutencoes,
        String usuario, Object key) throws Exception {
        Algoritimo algoritimo = FabricaSubSistema.getAlgoritimo();

        Auditoria auditoria = FabricaSubSistema.getAuditoria();

        ManutencaoDAO manutencaoDAO = FabricaDAO.getManutecaoDAO();

        ManutencaoVO manutencaoVO = new ManutencaoVO();

        manutencaoVO.setManu_maquina(Util.zeroOuInt(
                maquinasDetalheFormVO.getMaqn_id()));

        List manutencoesBanco = manutencaoDAO.pesquisarManutencaoVO(manutencaoVO,
                key);

        List remover = algoritimo.gerarListaRemoverIdsReais(manutencoes,
                manutencoesBanco);

        for (Iterator iter = remover.iterator(); iter.hasNext();) {
            ManutencaoVO element = (ManutencaoVO) iter.next();

            Manutencao manutencao = new Manutencao();

            manutencao.setManu_id(element.getManu_id());

            manutencaoDAO.excluirManutencaoVO(manutencao, key);

            auditoria.auditarRecurso(key, usuario, manutencao, Auditoria.EXCLUIR);
        }
    }

    public List pesquisarManutencao(Object form) throws Exception {
        MaquinasDetalheFormVO maquinasDetalheFormVO = new MaquinasDetalheFormVO();

        ManutencaoDAO manutencaoDAO = FabricaDAO.getManutecaoDAO();

        BeanUtil.copiarVO(form, maquinasDetalheFormVO);

        ManutencaoVO manutencaoVO = new ManutencaoVO();

        manutencaoVO.setManu_maquina(Util.zeroOuInt(
                maquinasDetalheFormVO.getMaqn_id()));

        return manutencaoDAO.pesquiarManutencaoVO(manutencaoVO);
    }
}
